import logging
import os

from selenium import webdriver  # 导入Selenium的webdriver模块，用于控制浏览器
from selenium.webdriver.support.expected_conditions import none_of
from webdriver_manager.chrome import ChromeDriverManager  # 导入ChromeDriverManager，用于自动管理ChromeDriver
from selenium.webdriver.chrome.service import Service  # 导入Service模块（未使用，注释掉）
from selenium.webdriver.chrome.options import Options  # 导入Chrome的Options模块，用于配置浏览器选项
from selenium.webdriver.common.keys import Keys  # 导入Keys模块，用于模拟键盘操作
from selenium.webdriver.common.by import By  # 导入By模块，用于指定元素的定位方式
import time  # 导入time模块，用于添加延迟
from custom_logger import PrefixDateLogger
from datetime import datetime
from pathlib import Path
import platform

class PanelImage:

    def __init__(self,grafana_url= "http://172.29.151.181:3000"):

        self.logger = PrefixDateLogger("send_data_email")
        self.logger.info('PanelImage begin init')
        #self.grafana_url = "http://47.106.173.230:3000"  # 如 http://192.168.1.100:3000
        self.grafana_url = grafana_url
        self.dashboard_id = "_YpvtbgDz"  # 如 abc123xyz
        self.dashboard_name="jvm-micrometer"
        # 配置 Chrome 无头模式
        chrome_options = Options()  # 创建Chrome选项实例
        chrome_options.add_argument("--headless")  # 启用无头模式，不显示浏览器界面
        chrome_options.add_argument("--disable-gpu")  # 禁用 GPU 加速，适用于无头模式
        chrome_options.add_argument("--no-sandbox")  # 禁用沙盒模式，提高性能
        chrome_options.add_argument("--disable-dev-shm-usage")  # 禁用 /dev/shm，避免内存问题

        # 使用 ChromeDriverManager 安装并获取 ChromeDriver 的路径
        driver_path = ChromeDriverManager().install()

        # 创建 Service 对象
        ver = platform.python_version()
        self.logger.info(ver)
        if ver.startswith("3.9"):
            service = Service('/usr/local/bin/chromedriver141')   # 指定 141 版驱动
            chrome_options.binary_location = "/usr/bin/chromium-browser"
        else :
            service = webdriver.ChromeService(executable_path=driver_path)

        # 初始化 WebDriver，同时传递 Service 和 Options
        self.driver = webdriver.Chrome(service=service, options=chrome_options)

        # Grafana登录信息
        self.username = 'admin'  # Grafana用户名
        #self.password = 'your-secure-password'  # Grafana密码
        self.password = 'Keepgo123@cys'

        self.save_dir=str(Path.cwd())+"/screenshot/"
        self.logger.info('PanelImage finish init')


    def general_image(self,dashboard_id=None,dashboard_name=None,panel_id=None,screen_hight=1080):

        if dashboard_id:
            self.dashboard_id=dashboard_id
        if dashboard_name:
            self.dashboard_name=dashboard_name
        if panel_id is None:
            panel_id = ""
        url = f'{self.grafana_url}'  # Grafana登录页面URL（需要替换为实际URL）
        panel_url = f'{self.grafana_url}/d/{self.dashboard_id}/{self.dashboard_name}?orgId=1&refresh=1m&viewPanel={panel_id}'  # Grafana监控面板页面URL（需要替换为实际URL）
        self.logger.info(f'general_image dashboard_id:{dashboard_id},dashboard_name:{dashboard_name},panel_id:{panel_id}')
        # 设置浏览器窗口大小（根据需要调整宽度和高度）
        self.driver.set_window_size(1920, screen_hight)  # 设置窗口大小为1920x1080
        # 打开Grafana并登录
        self.driver.get(url)  # 打开Grafana登录页面
        self.logger.info('driver get url finish')
        time.sleep(5)  # 等待页面加载，延迟2秒

        username_input = self.driver.find_element(By.NAME, 'user')  # 定位用户名输入框
        username_input.send_keys(self.username)  # 输入用户名
        password_input = self.driver.find_element(By.NAME, 'password')  # 定位密码输入框
        password_input.send_keys(self.password)  # 输入密码
        password_input.send_keys(Keys.RETURN)  # 按下回车键提交表单
        self.logger.info('driver input user/pwsd, enter return')

        time.sleep(5)  # 等待登录完成，延迟2秒

        # 导航到监控面板页面
        self.driver.get(panel_url)  # 打开监控面板页面
        time.sleep(10)
        btn_close_menu = self.driver.find_element(By.ID, 'mega-menu-header-toggle')  # 定位密码输入框

        # 直接点击（按下并松开）
        btn_close_menu.click()
        time.sleep(2)  # 等待页面加载完成，延迟5秒（根据页面复杂度调整）
        self.logger.info(f'driver get panel_url:{panel_url}')
        # 截图保存
        # 检查目录是否存在
        if not os.path.exists(self.save_dir):
            # 不存在则创建（mkdirs 会自动创建多级父目录，exist_ok=True 避免目录已存在时报错）
            os.makedirs(self.save_dir, exist_ok=True)

        cur_time = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
        screenshot_path = f'{self.save_dir}{self.dashboard_name}_{cur_time}.png'  # 截图保存路径
        self.driver.save_screenshot(screenshot_path)  # 保存截图到指定路径
        self.logger.info(f"Screenshot saved to {screenshot_path}")  # 打印截图保存路径

        # 关闭浏览器
        self.driver.quit()  # 关闭浏览器并释放资源

        return screenshot_path


if __name__ == "__main__":
    # 创建连接实例
    panel_image = PanelImage()
    panel_image.general_image("adztqbf","overview", None, 1600)